
import axios from 'axios';
import { Message, Modal } from '@arco-design/web-vue';
import { useUserStore } from '@/store';
import { getToken } from '@/utils/auth';

import type { Router, LocationQueryRaw } from 'vue-router';

declare type Recordable<T = any> = Record<string, T>;
export interface HttpResponse{
  time?: number;
  msg?: string;
  code?: number;
  data?: any;
}

if (import.meta.env.VITE_API_BASE_URL) {
  axios.defaults.baseURL = import.meta.env.VITE_API_BASE_URL;
}

// 请求拦截器
axios.interceptors.request.use((config) => {
    // 让每个请求携带令牌
    // 这个示例使用JWT令牌
    // 授权是自定义头密钥
    // 请根据实际情况进行修改
    const token = getToken();
    if (token) {
      if (!config.headers) {
        (config as Recordable).headers = {};
      }
      config.headers.token = `${token}`;
    }

    // post 做特殊处理
    if(config.method === 'post'){
      let newData = {};
      const { data } = config;
      if(data !== null && typeof(data) !== "undefined"){
        Object.keys(config.data).forEach(key=> {
          const value = config.data[key];
          if(value !== null && typeof(value) !== "undefined"){
            let itemValue = String(data[key]).replace(/\s/g, '');
            if(itemValue !== ''){  newData[key] = itemValue }
          }
        })
      }
      config.data = newData;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

const errorMsg = '接口请求错误！';

// 添加响应拦截器
axios.interceptors.response.use((response) => {
    const res = response.data;

     // 如果自定义代码不是1，则判断为错误。
    if (Number(res.code) !== 1) {
      Message.error({
        content: res.msg || errorMsg,
        duration: 5 * 1000,
      });


      // 50008：非法令牌; 50012：其他客户端登录; 50014：令牌过期;
      if ([401, 0, 403].includes(res.code)) {
            
        // Message.error({
        //   content: error.msg || '请求错误',
        //   duration: 5 * 1000,
        // });

        // Modal.error({
        //   title: '退出登录提醒',
        //   content:'您已注销，您可以取消留在此页面，或再次登录',
        //   okText: '重新登录',
        //   async onOk() {
        //     const userStore = useUserStore();
        //     await userStore.logout();
        //     window.location.reload();
        //   },
        // });
      }
      return Promise.reject(new Error(res.msg || errorMsg));
    }
    return res;
  },
  (error) => {
    Message.error({
      content: error.msg || '请求错误',
      duration: 5 * 1000,
    });
    return Promise.reject(error);
  }
);
